#pragma once

#include "pch.h"
#include <stdio.h>
#include <io.h>
#include <direct.h>
#include <conio.h>

void ocall_get_string(char *buf, int len)
{
    int i = 0;
    while (i < len) {
        buf[i] = _getch();
        if (buf[i] == '\r' || buf[i] == '\n')
            break;

        if (buf[i] == '\b') 
        {
            if (i == 0) {
                continue;
            }

            --i; 
            printf("\b \b"); 
        }
        else 
        { 
            ++i; 
            printf("*"); 
        };
    }
    buf[i] = '\0';
}

void ocall_print_string(const char *string)
{
    printf("%s", string);
}

void ocall_log_info(const char *buf)
{
	LOG(INFO) << buf;
}

void ocall_log_warning(const char *buf)
{
	LOG(WARNING) << buf;
}

void ocall_log_error(const char *buf)
{
	LOG(ERROR) << buf;
}

void ocall_log_fatal(const char *buf)
{
	LOG(FATAL) << buf;
}

int ocall_fopen(_int64 *file, const char *file_name, const char *mode)
{
    FILE *temp_file = nullptr;

    int return_code = fopen_s(&temp_file, file_name, mode);

    *file = (_int64)temp_file;

    return return_code;
}

int ocall_fclose(_int64 file)
{
    return fclose((FILE *)file);
}

int ocall_fputs(_int64 file, const char *buf)
{
    return fputs(buf, (FILE *)file);
}

int ocall_fseek(_int64 file, long offset, int origin)
{
    return fseek((FILE *)file, offset, origin);
}

long ocall_ftell(_int64 file)
{
    return ftell((FILE *)file);
}

size_t ocall_fread(_int64 file, void *buf, int buf_len, size_t element_size, size_t element_count)
{
    return fread(buf, element_size, element_count, (FILE *)file);
}

char* ocall_fgets(_int64 file, char *buf, int buf_len)
{
    return fgets(buf, buf_len, (FILE *)file);
}

int ocall_is_dir_exsit(const char *dri_name)
{
    return _access(dri_name, 0);
}

int ocall_make_dir(const char *dir_name)
{
    return _mkdir(dir_name);
}